package com.hhkj.admin.order.service.biz;

import com.hhkj.admin.order.domain.Order;
import com.hhkj.admin.order.domain.OrderItem;
import com.hhkj.admin.order.domain.OrderRefund;
import com.hhkj.admin.order.model.req.OrderRefundReq;
import com.hhkj.admin.order.model.res.OrderRefundRes;
import com.ruoyi.common.base.biz.service.biz.BaseBizService;
import com.ruoyi.common.base.model.extend.ValidError;

import java.util.List;


public interface OrderRefundBizService extends BaseBizService<OrderRefund, OrderRefundReq, OrderRefundRes> {

    /**
     * 申请退款
     * @param orderRefundReq 申请参数，包含子订单id列表
     * @param isAdminApply 是否是管理员发起的退款：true - 管理员发起, false - 销售发起;（区别是，管理员发起无需进行业务校验）
     * @return 如果子订单包含不可退款的记录，会在失败说明中说明原因
     */
    OrderRefund applyRefund(OrderRefundReq orderRefundReq, boolean isAdminApply);

    /**
     * 同意退款（要求有且只有一个正在处理中的退款记录）
     * @param orderRefundReq 同意退款请求，包含orderId和auditDescription退款说明（这个退款说明是同意退款的说明）
     * @return
     */
    OrderRefund agreeRefund(OrderRefundReq orderRefundReq);

    /**
     * 打款，并上传打款凭证
     * @param orderRefundReq 包含订单id, payoutDate打款时间, 打款凭证payoutReceiptUtl, finalPrice最终退款金额
     * @param createBy 操作人
     * @return
     */
    boolean payout(OrderRefundReq orderRefundReq, Long createBy);

    /**
     * 判断订单是否可以退款
     * @param order
     * @return
     */
    boolean isRefundableOrder(Order order);

    /**
     * 判断子订单是否可以退款
     * @param orderItemList 子订单列表
     * @param order 订单
     * @return
     */
    List<ValidError<OrderItem>> isRefundableOrderItemList(List<? extends OrderItem> orderItemList, Order order);
}
